Introdução à Ciência dos Dados - Aula 5

Mestrado Profissional em Administração

Prof. Washington Santos da Silva

25/04/2023

Objetivos

Análise Exploratória de Dados: Visão Geral

– Wickham & Grolemund, Visualize

Import: importar/inserir seus dados no R.

Tidy: Armazenar seus dados em um formato consistente.

Transform: – criando novas variáveis a partir das já existentes e sumarizar informações.

Visualize: Representar visualmente seus dados.

Esta parte do livro mostra como usar a visualização e a transformação para explorar dados de maneira sistemática.

EDA é um ciclo iterativo no qual:

- Geramos perguntas sobre os dados.

- Procuramos por respostas visualizando, transformando e modelando os 
  dados.

- Usamos o que aprendemos para refinar as perguntas e/ou gerar novas      
  perguntas.

- A EDA não é um processo formal com um conjunto estrito de regras.

- Durante as fases iniciais da EDA, devemos nos sentir livres para 
  investigar quaisquer ideias que surjam.

- Algumas ideias irão gerar frutos, outras serão descartadas.

- Na medida em que a exploração continua, devemos nos focar em algumas 
  questões e áreas mais relevantes e produtivas.

A EDA é uma parte importante de qualquer análise de dados:

Variabilidade/Variação

Dois tipos de perguntas sobre os dados sempre úteis para fazer descobertas:

  1. Que tipo de variação ocorre dentro das variáveis?

  2. Que tipo de covariação ocorre entre as variáveis?

O restante desta aula foca-se nestas duas perguntas.

Análise Exploratória Numérica

Parte 1: Arquivos de dados:

Retornos da carteira:

dplyr::glimpse(carteira)
## Rows: 3,529
## Columns: 3
## $ VALE     <dbl> NA, 0.0172102476, 0.0824816167, -0.0221424526, -0.0582752221,…
## $ WEGE3.SA <dbl> NA, 0.028168914, 0.004931529, -0.018538688, -0.002777568, -0.…
## $ PETR4.SA <dbl> NA, -0.001435125, 0.048850959, -0.016438432, -0.038718922, -0…

Estrutura do objeto:

## [1] "tbl_df"     "tbl"        "data.frame"

Amostra de dados do projeto Gestão de Risco nos Institutos Federais:

dplyr::glimpse(risco)
## Rows: 21
## Columns: 8
## $ q1_1 <chr> "41-50 anos", "41-50 anos", "31-40 anos", "31-40 anos", "31-40 an…
## $ q1_2 <chr> "Feminino", "Masculino", "Masculino", "Feminino", "Masculino", "F…
## $ q1_3 <chr> "Técnico Administrativo", "Técnico Administrativo", "Técnico Admi…
## $ q1_4 <chr> "Diretoria Executiva de Desenvolvimento Insttucional", "Coordenad…
## $ q1_5 <chr> "Mestrado", "Mestrado", "Mestrado", "Especialização", "Mestrado",…
## $ q1_6 <chr> "11-15 anos", "6-10 anos", "6-10 anos", "6-10 anos", "6-10 anos",…
## $ q1_7 <chr> "Até 5 anos", "6-10 anos", "Até 5 anos", "6-10 anos", "6-10 anos"…
## $ q1_8 <chr> "Sim", "Não", "Sim", "Sim", "Sim", NA, "Sim", "Sim", "Não", "Sim"…

Estrutura do objeto:

class(risco)
## [1] "tbl_df"     "tbl"        "data.frame"

Parte 2: Estatísticas Descritivas em R

  1. Função summary()

Retornos da carteira:

summary(carteira)
##       VALE             WEGE3.SA           PETR4.SA       
##  Min.   :-0.23803   Min.   :-0.20620   Min.   :-0.29698  
##  1st Qu.:-0.01634   1st Qu.:-0.01031   1st Qu.:-0.01438  
##  Median : 0.00044   Median : 0.00045   Median : 0.00000  
##  Mean   : 0.00062   Mean   : 0.00108   Mean   : 0.00058  
##  3rd Qu.: 0.01650   3rd Qu.: 0.01206   3rd Qu.: 0.01454  
##  Max.   : 0.28441   Max.   : 0.13894   Max.   : 0.22222  
##  NA's   :84         NA's   :135        NA's   :135

Gestão de Risco - Questionário:

summary(risco)
##      q1_1               q1_2               q1_3               q1_4          
##  Length:21          Length:21          Length:21          Length:21         
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##      q1_5               q1_6               q1_7               q1_8          
##  Length:21          Length:21          Length:21          Length:21         
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character
  1. Função skimr::skim()

Retornos da carteira:

skimr::skim(carteira)
Data summary
Name carteira
Number of rows 3529
Number of columns 3
_______________________
Column type frequency:
numeric 3
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
VALE 84 0.98 0 0.03 -0.24 -0.02 0 0.02 0.28 ▁▁▇▁▁
WEGE3.SA 135 0.96 0 0.02 -0.21 -0.01 0 0.01 0.14 ▁▁▇▇▁
PETR4.SA 135 0.96 0 0.03 -0.30 -0.01 0 0.01 0.22 ▁▁▇▂▁

Gestão de Risco - Questionário:

skimr::skim(risco)
Data summary
Name risco
Number of rows 21
Number of columns 8
_______________________
Column type frequency:
character 8
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
q1_1 0 1.00 10 10 0 3 0
q1_2 0 1.00 8 9 0 2 0
q1_3 0 1.00 7 22 0 2 0
q1_4 2 0.90 7 87 0 18 0
q1_5 0 1.00 8 14 0 2 0
q1_6 0 1.00 9 15 0 4 0
q1_7 0 1.00 9 15 0 4 0
q1_8 1 0.95 3 3 0 2 0

Parte 3: Preparando os dados para análise

carteira_analise <- na.omit(carteira)
summary(carteira_analise)
##       VALE               WEGE3.SA             PETR4.SA         
##  Min.   :-0.2380303   Min.   :-0.2061975   Min.   :-0.2969777  
##  1st Qu.:-0.0161553   1st Qu.:-0.0102900   1st Qu.:-0.0145569  
##  Median : 0.0003861   Median : 0.0005578   Median : 0.0000000  
##  Mean   : 0.0007789   Mean   : 0.0011484   Mean   : 0.0006453  
##  3rd Qu.: 0.0166091   3rd Qu.: 0.0122094   3rd Qu.: 0.0147556  
##  Max.   : 0.2844115   Max.   : 0.1389445   Max.   : 0.2222221

Criando uma estrutura de dados longer

carteira_analise_longer <- carteira_analise %>% 
      tidyr::pivot_longer(cols = c('VALE', 'WEGE3.SA', 'PETR4.SA'), 
                          names_to = "acoes", 
                          values_to = "retornos")

head(carteira_analise_longer)
## # A tibble: 6 × 2
##   acoes    retornos
##   <chr>       <dbl>
## 1 VALE      0.0172 
## 2 WEGE3.SA  0.0282 
## 3 PETR4.SA -0.00144
## 4 VALE      0.0825 
## 5 WEGE3.SA  0.00493
## 6 PETR4.SA  0.0489
risco_analise <- risco %>%
  transmute(
    q1_1 = factor(
      q1_1,
      levels = c(
        "20-30 anos",
        "31-40 anos",
        "41-50 anos",
        "51-60 anos",
        "Mais de 60 anos"
      ),
      ordered = TRUE
    ),
    q1_2 = factor(q1_2),
    q1_3 = factor(q1_3),
    q1_4 = factor(q1_4),
    q1_5 = factor(
      q1_5,
      levels =  c(
        "Ensino fundamental",
        "Ensino médio",
        "Ensino superior",
        "Especialização",
        "Mestrado",
        "Doutorado"
      ),
      ordered = TRUE
    ),
    q1_6 = factor(
      q1_6,
      levels = c(
        "Até 5 anos",
        "6-10 anos",
        "11-15 anos",
        "16-20 anos",
        "Mais de 20 anos"
      ),
      ordered = TRUE
    ),
    q1_7 = factor(
      q1_7,
      levels = c(
        "Até 5 anos",
        "6-10 anos",
        "11-15 anos",
        "16-20 anos",
        "Mais de 20 anos"
      ),
      ordered = TRUE
    ),
    q1_8 = factor(q1_8)
  )

Verificando o novo objeto `risco_analise``:

skimr::skim(risco_analise)
Data summary
Name risco_analise
Number of rows 21
Number of columns 8
_______________________
Column type frequency:
factor 8
________________________
Group variables None

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
q1_1 0 1.00 TRUE 3 31-: 12, 41-: 7, 51-: 2, 20-: 0
q1_2 0 1.00 FALSE 2 Mas: 12, Fem: 9
q1_3 0 1.00 FALSE 2 Téc: 20, Doc: 1
q1_4 2 0.90 FALSE 18 Dir: 2, Adm: 1, Adm: 1, Ass: 1
q1_5 0 1.00 TRUE 2 Mes: 14, Esp: 7, Ens: 0, Ens: 0
q1_6 0 1.00 TRUE 4 6-1: 9, 11-: 9, 16-: 2, Mai: 1
q1_7 0 1.00 TRUE 4 Até: 13, 6-1: 6, 11-: 1, Mai: 1
q1_8 1 0.95 FALSE 2 Sim: 17, Não: 3

Parte 4: Estatísticas Descritivas

fBasics::basicStats(carteira_analise)
##                    VALE    WEGE3.SA    PETR4.SA
## nobs        3311.000000 3311.000000 3311.000000
## NAs            0.000000    0.000000    0.000000
## Minimum       -0.238030   -0.206198   -0.296978
## Maximum        0.284411    0.138944    0.222222
## 1. Quartile   -0.016155   -0.010290   -0.014557
## 3. Quartile    0.016609    0.012209    0.014756
## Mean           0.000779    0.001148    0.000645
## Median         0.000386    0.000558    0.000000
## Sum            2.578996    3.802362    2.136589
## SE Mean        0.000564    0.000375    0.000520
## LCL Mean      -0.000327    0.000413   -0.000374
## UCL Mean       0.001885    0.001884    0.001664
## Variance       0.001054    0.000465    0.000894
## Stdev          0.032468    0.021574    0.029902
## Skewness       0.283139   -0.317256   -0.266338
## Kurtosis       6.665432    6.956479    8.008591
summary(risco_analise)
##               q1_1           q1_2                        q1_3   
##  20-30 anos     : 0   Feminino : 9   Docente               : 1  
##  31-40 anos     :12   Masculino:12   Técnico Administrativo:20  
##  41-50 anos     : 7                                             
##  51-60 anos     : 2                                             
##  Mais de 60 anos: 0                                             
##                                                                 
##                                                                 
##                                                                                       q1_4   
##  Diretora de Desenvolvimento Institucional                                              : 2  
##  Administrador                                                                          : 1  
##  Administrador, Diretor de Desenvolvimento Institucional                                : 1  
##  Assistente em Administração | Ouvidora | Presidente da Unidade de Gestão da Integridade: 1  
##  auditor                                                                                : 1  
##  (Other)                                                                                :13  
##  NA's                                                                                   : 2  
##                  q1_5                 q1_6                q1_7      q1_8   
##  Ensino fundamental: 0   Até 5 anos     :0   Até 5 anos     :13   Não : 3  
##  Ensino médio      : 0   6-10 anos      :9   6-10 anos      : 6   Sim :17  
##  Ensino superior   : 0   11-15 anos     :9   11-15 anos     : 1   NA's: 1  
##  Especialização    : 7   16-20 anos     :2   16-20 anos     : 0            
##  Mestrado          :14   Mais de 20 anos:1   Mais de 20 anos: 1            
##  Doutorado         : 0                                                     
## 
##       item        ano                  pe             ve          
##  Min.   :   1   2018:1601   eletrico    :1140   Min.   :     0.0  
##  1st Qu.:1398   2019:1591   Bens imoveis:1093   1st Qu.:     8.9  
##  Median :2796   2020:2398   expediente  : 543   Median :    28.3  
##  Mean   :2796               laboratorial: 535   Mean   :  1340.3  
##  3rd Qu.:4193               medicao     : 451   3rd Qu.:   105.2  
##  Max.   :5591               Esportivo   : 413   Max.   :428390.0  
##                             (Other)     :1415                     
##        vh              percent             x3c              x2c         
##  Min.   :     0.0   Min.   :-1.0000   Min.   :0.0000   Min.   :0.00000  
##  1st Qu.:     0.6   1st Qu.:-0.7500   1st Qu.:1.0000   1st Qu.:0.00000  
##  Median :     9.6   Median :-0.3750   Median :1.0000   Median :0.00000  
##  Mean   :   701.5   Mean   :-0.4262   Mean   :0.9562   Mean   :0.04526  
##  3rd Qu.:    41.1   3rd Qu.:-0.0600   3rd Qu.:1.0000   3rd Qu.:0.00000  
##  Max.   :378000.0   Max.   :16.0700   Max.   :1.0000   Max.   :1.00000  
##                                                                         
##        it               cb               fn              pa         
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.000   Min.   :0.00000  
##  1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.000   1st Qu.:0.00000  
##  Median :1.0000   Median :0.0000   Median :0.000   Median :0.00000  
##  Mean   :0.5379   Mean   :0.1546   Mean   :0.237   Mean   :0.05564  
##  3rd Qu.:1.0000   3rd Qu.:0.0000   3rd Qu.:0.000   3rd Qu.:0.00000  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.000   Max.   :1.00000  
##                                                                     
##        cc               ds                pt              inst      
##  Min.   :0.0000   Min.   :0.00000   Min.   : 0.000   Min.   :0.000  
##  1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.: 2.000   1st Qu.:0.000  
##  Median :0.0000   Median :0.00000   Median : 4.000   Median :0.000  
##  Mean   :0.1474   Mean   :0.06547   Mean   : 4.687   Mean   :0.471  
##  3rd Qu.:0.0000   3rd Qu.:0.00000   3rd Qu.: 6.000   3rd Qu.:1.000  
##  Max.   :1.0000   Max.   :1.00000   Max.   :30.000   Max.   :1.000  
##                                                                     
##        re               lc        
##  Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.:0.0000  
##  Median :0.0000   Median :0.0000  
##  Mean   :0.2612   Mean   :0.2669  
##  3rd Qu.:1.0000   3rd Qu.:1.0000  
##  Max.   :1.0000   Max.   :1.0000  
## 

Funções R:

media amostral

## [1] 0.0005773374

mediana amostral

## [1] 0

minimo, quartis e maximo amostrais

##          0%         25%         50%         75%        100% 
## -0.29697774 -0.01438195  0.00000000  0.01453912  0.22222214

percentis especificos: \(p_{32}\), \(p_{57}\) e \(p_{98}\)

##          32%          57%          98% 
## -0.009350287  0.003712789  0.067080166

minimo entre os elementos de um vetor

## [1] -0.2969777

máximo dos elementos do vetor

## [1] 0.2222221

variância amostral

## [1] 0.0008882345

desvio-padrão amostral

## [1] 0.02980326

desvio-absoluto mediano amostral

## [1] 0.02150178

intervalo interquartil amostral

## [1] 0.02892107

Tabelas de Frequência: Função tabyl() do pacote janitor

tab1 <- risco_analise |> tabyl(q1_1)
tab1
##             q1_1  n   percent
##       20-30 anos  0 0.0000000
##       31-40 anos 12 0.5714286
##       41-50 anos  7 0.3333333
##       51-60 anos  2 0.0952381
##  Mais de 60 anos  0 0.0000000
tab2 <- risco_analise |> tabyl(q1_2)
tab2
##       q1_2  n   percent
##   Feminino  9 0.4285714
##  Masculino 12 0.5714286
tab3 <- risco_analise |> tabyl(q1_3)
tab3
##                    q1_3  n    percent
##                 Docente  1 0.04761905
##  Técnico Administrativo 20 0.95238095

Customizando as tabelas:

tab4 <- risco_analise |> tabyl(q1_1) |> 
   adorn_totals(c("row")) |>
  adorn_pct_formatting(rounding = "half up", digits = 0) |>
  knitr::kable()
       
tab4
q1_1 n percent
20-30 anos 0 0%
31-40 anos 12 57%
41-50 anos 7 33%
51-60 anos 2 10%
Mais de 60 anos 0 0%
Total 21 100%
tab5 <- risco_analise |> tabyl(q1_2) |> 
   adorn_totals(c("row")) |>
   adorn_pct_formatting(rounding = "half up", digits = 0) |>
   knitr::kable()

tab5
q1_2 n percent
Feminino 9 43%
Masculino 12 57%
Total 21 100%
tab5 <- risco_analise |> tabyl(q1_3) |> 
  adorn_totals(c("row")) |>
  adorn_pct_formatting(rounding = "half up", digits = 0) |>
  knitr::kable()

tab5
q1_3 n percent
Docente 1 5%
Técnico Administrativo 20 95%
Total 21 100%

Tabulação cruzada:

tab6 <- risco_analise |> tabyl(q1_2, q1_3)

tab6
##       q1_2 Docente Técnico Administrativo
##   Feminino       0                      9
##  Masculino       1                     11

Customizando a tabela:

tab7 <- risco_analise |> tabyl(q1_2, q1_3) |>
  adorn_percentages("row") |>
  adorn_pct_formatting(digits = 2) |>
  adorn_ns() |>
  knitr::kable()

tab7
q1_2 Docente Técnico Administrativo
Feminino 0.00% (0) 100.00% (9)
Masculino 8.33% (1) 91.67% (11)
tab8 <- risco_analise |> 
        tabyl(q1_1, q1_2, q1_3)

tab8
## $Docente
##             q1_1 Feminino Masculino
##       20-30 anos        0         0
##       31-40 anos        0         0
##       41-50 anos        0         1
##       51-60 anos        0         0
##  Mais de 60 anos        0         0
## 
## $`Técnico Administrativo`
##             q1_1 Feminino Masculino
##       20-30 anos        0         0
##       31-40 anos        5         7
##       41-50 anos        2         4
##       51-60 anos        2         0
##  Mais de 60 anos        0         0

Tabelas para Publicação Usando os pacotes gtsummary e flextable

Tabela: Variáveis Categóricas

# Pacote utilizado
library(gtsummary)
library(flextable)

tabgt01 <-cotacoes %>%  
  select(-c(item, ve, vh, percent, pt)) %>% 
  tbl_summary(
    by = ano,
    statistic = list(
      all_categorical() ~ "{n} ({p}%)"
    ),
    label = list(pe ~ "Grupo Licitado", 
                 it ~ "Pesquisa de Preços (internet)",
                 cb ~ "Pesquisa de Preços (combinada)",
                 fn ~ "Pesquisa de Preços (fornecedores)",
                 pa ~ "Pesquisa de Preços (painel)"
                 ),
    digits = all_continuous() ~ 2
  ) %>%
  modify_header(label ~ "**Variável**") %>%
  modify_caption("TABELA 1. Estatísticas Descritivas: Variáveis Categóricas.") %>%
  modify_footnote(all_stat_cols() ~ " N = total de observações do ano. n = (total de observações da variável categórica/nível) (%) = porcentagem do total de observações do ano")

tabgt01
TABELA 1. Estatísticas Descritivas: Variáveis Categóricas.
Variável 2018, N = 1,6011 2019, N = 1,5911 2020, N = 2,3981
Grupo Licitado
    Bens imoveis 486 (30%) 229 (14%) 378 (16%)
    eletrico 305 (19%) 584 (37%) 251 (10%)
    Esportivo 123 (7.7%) 31 (1.9%) 259 (11%)
    expediente 0 (0%) 0 (0%) 543 (23%)
    ferramentas 126 (7.9%) 51 (3.2%) 110 (4.6%)
    laboratorial 0 (0%) 332 (21%) 203 (8.5%)
    limpeza 9 (0.6%) 110 (6.9%) 269 (11%)
    medicao 106 (6.6%) 103 (6.5%) 242 (10%)
    quimico 252 (16%) 76 (4.8%) 0 (0%)
    veterinario 194 (12%) 75 (4.7%) 143 (6.0%)
x3c 1,529 (96%) 1,502 (94%) 2,314 (96%)
x2c 43 (2.7%) 152 (9.6%) 58 (2.4%)
Pesquisa de Preços (internet) 777 (49%) 524 (33%) 1,706 (71%)
Pesquisa de Preços (combinada) 283 (18%) 353 (22%) 228 (9.5%)
Pesquisa de Preços (fornecedores) 484 (30%) 425 (27%) 416 (17%)
Pesquisa de Preços (painel) 36 (2.2%) 226 (14%) 49 (2.0%)
cc 236 (15%) 215 (14%) 373 (16%)
ds 95 (5.9%) 116 (7.3%) 155 (6.5%)
inst 553 (35%) 298 (19%) 1,782 (74%)
re 705 (44%) 677 (43%) 78 (3.3%)
lc 338 (21%) 616 (39%) 538 (22%)
1 N = total de observações do ano. n = (total de observações da variável categórica/nível) (%) = porcentagem do total de observações do ano
as_gt(tabgt01) %>% 
     gt::gtsave(filename = "tabs/tabgt01.rtf")

Tabela: Variáveis Numéricas

tabgt02 <- cotacoes %>% select(c(ano, ve, vh, percent, pt)) %>%
  tbl_summary(
    by = ano,
    statistic = list(
      all_continuous() ~ c("({median}, {mean}) ({p25}, {p75}), ({min}, {max}) ({IQR}, {sd})")
    ),
    label = list( 
      ve ~ "Valor Estimado",
      vh ~ "Valor Homologado",
      percent ~ "Variação (%)", 
      pt ~ "Total de Fornecedores Participantes"),
    digits = all_continuous() ~ 2
  ) %>%
  modify_header(label ~ "**Variável**") %>%
  modify_caption("TABELA 2. Estatísticas Descritivas: Variáveis Numéricas.") %>%
  modify_footnote(all_stat_cols() ~ "(média, mediana) (p25, p75) (mín., máx.) (IIQ, desvio_padrão)"
  )

tabgt02
TABELA 2. Estatísticas Descritivas: Variáveis Numéricas.
Variável 2018, N = 1,6011 2019, N = 1,5911 2020, N = 2,3981
Valor Estimado (31.35, 312.32) (11.26, 96.89), (0.05, 51,293.50) (85.63, 2,147.00) (24.88, 498.69) (7.48, 89.29), (0.04, 68,000.00) (81.81, 3,591.55) (28.85, 2,584.92) (8.34, 128.91), (0.02, 428,390.00) (120.57, 23,643.17)
Valor Homologado (13.90, 171.85) (0.70, 48.42), (0.00, 48,900.00) (47.72, 1,599.76) (9.39, 234.05) (0.77, 39.89), (0.00, 45,444.88) (39.12, 2,074.35) (7.73, 1,365.22) (0.49, 37.98), (0.00, 378,000.00) (37.48, 16,990.37)
Variação (%) (-0.28, -0.36) (-0.70, 0.00), (-1.00, 16.07) (0.70, 0.68) (-0.32, -0.40) (-0.70, 0.00), (-1.00, 0.17) (0.70, 0.38) (-0.45, -0.49) (-0.80, -0.20), (-1.00, 4.07) (0.60, 0.36)
Total de Fornecedores Participantes (4.00, 4.19) (2.00, 6.00), (0.00, 15.00) (4.00, 2.62) (4.00, 4.61) (2.00, 7.00), (0.00, 30.00) (5.00, 3.08) (5.00, 5.07) (3.00, 7.00), (0.00, 17.00) (4.00, 3.27)
1 (média, mediana) (p25, p75) (mín., máx.) (IIQ, desvio_padrão)
as_gt(tabgt02) %>% 
     gt::gtsave(filename = "tabs/tabgt02.rtf")

Análise Exploratória Gráfica

Análise Exploratória Gráfica: Visualizando distribuições

Características observáveis na distribuição de variáveis numéricas

Por que visualizar a distribuição dos dados?

Visualizando distribuições: Histograma

h1 <- ggplot(carteira, aes(x = VALE)) + geom_histogram()
h1

Customizando um Histograma

h1c <- ggplot(carteira, aes(x = VALE)) +
  geom_histogram() +
  labs(x = "Retornos",
       y = "Frequência",
       title = "Vale: Retornos das Ações") + 
  xlim(-0.3, 0.3) + 
  theme_minimal()
h1c

Histograma

h2 <- ggplot(carteira, aes(x = PETR4.SA)) + geom_histogram() 
h2

Customizando:

h2c <- ggplot(carteira, aes(x = PETR4.SA)) +
  geom_histogram() +
  labs(x = "Retornos",
       y = "Frequência",
       title = "Petrobrás: Retornos das Ações") + 
  xlim(-0.3, 0.3) + 
  theme_minimal()
h2c

h3 <- ggplot(carteira, aes(x = WEGE3.SA)) + geom_histogram()
h3

Customizando

h3c <- ggplot(carteira, aes(x = WEGE3.SA)) +
  geom_histogram() +
  labs(x = "Retornos",
       y = "Frequência",
       title = "WEG: Retornos das Ações") + 
  xlim(-0.3, 0.3) + 
  theme_minimal()
h3c

library(patchwork)
painel01 <- h1c / h2c / h3c
painel01

library(patchwork)
painel01 <- (h1c + h2c + h3c) + plot_layout(nrow = 2)
painel01

Densidade Empírica

d1 <- ggplot(carteira, aes(x = VALE)) + geom_density()
d1

Customizando

d1c <- ggplot(carteira, aes(x = VALE)) +
  geom_density() +
  labs(x = "Retornos",
       y = "Densidade",
       title = "Vale: Retornos das Ações") +
  xlim(-0.3, 0.3) + 
  theme_minimal()

d1c

Densidade Empírica

d2 <- ggplot(carteira, aes(x = PETR4.SA)) + geom_density()
d2

Customizando

d2c <- ggplot(carteira, aes(x = PETR4.SA)) +
  geom_density() +
  labs(x = "Retornos",
       y = "Densidade",
       title = "Petrobrás: Retornos das Ações") + 
  xlim(-0.3, 0.3) + 
  theme_minimal()

d2c

Densidade Empírica

d3 <- ggplot(carteira, aes(x = WEGE3.SA)) + geom_density()
d3

Customizando

d3c <- ggplot(carteira, aes(x = WEGE3.SA)) +
  geom_density() +
  labs(x = "Retornos",
       y = "Densidade",
       title = "WEG: Retornos das Ações") +
  xlim(-0.3, 0.3) + 
  theme_minimal()
d3c

Densidade Empírica: Múltiplos gráficos em um painel

library(patchwork)
painel02 <- d1c / d2c / d3c
painel02

Densidade Empírica: Múltiplos gráficos em um painel

painel02 <- (d1c + d2c + d3c) + plot_layout(nrow = 2)
painel02

Histograma com Densidade Empírica

h1_d <- ggplot(carteira, aes(x = VALE)) + 
            geom_histogram(aes(y = ..density..)) +
            geom_density(col = "blue", size = 1.5) + 
            theme_minimal()
h1_d

Visualizando distribuições: Boxplot

Boxplot

b1 <- ggplot(carteira, aes(x = VALE)) + geom_boxplot()
b1

Boxplot: coord_flip() inverte a orientação

b1_inv <- ggplot(carteira, aes(x = VALE)) + geom_boxplot() + coord_flip()
b1_inv

Customizando

b1c <- ggplot(carteira, aes(x = VALE)) +
        geom_boxplot() +
        labs(x = "Retornos",
             y = NULL,
             title = "Vale: Retornos das Ações") +
        xlim(-0.3, 0.3) + 
       theme_minimal()

b1c

Boxplot

b2 <- ggplot(carteira, aes(x = PETR4.SA)) + geom_boxplot()
b2

Customizando

b2c <- ggplot(carteira, aes(x = PETR4.SA)) +
        geom_boxplot() +
        labs(x = "Retornos",
             y = NULL,
             title = "Petrobrás: Retornos das Ações") + 
       xlim(-0.3, 0.3) + 
       theme_minimal()
b2c

Boxplot

b3 <- ggplot(carteira, aes(x = WEGE3.SA)) + geom_boxplot()
b3

Customizando

b3c <- ggplot(carteira, aes(x = WEGE3.SA)) +
       geom_boxplot() +
       labs(x = "Retornos",
            y = NULL,
            title = "WEG: Retornos das Ações") +
       xlim(-0.3, 0.3) + 
       theme_minimal()

b3c

Boxplot: Múltiplos gráficos em um painel

library(patchwork)
painel03 <- b1c / b2c / b3c
painel03

Visualizando distribuições: Gráfico de Barras

Continuando com a usar o sistema de visualização do pacote ggplot2

ggplot(risco_analise, aes(x = q1_1)) + 
  geom_bar() +
  labs(title="Gráfico de Barra Simples",                 
       x="Idade",                          
       y="Frequência (n)") 

Invertendo os eixos usando coord_flip():

ggplot(risco_analise, aes(x = q1_1)) + 
  geom_bar() +
  labs(x="Idade",                          
       y="Frequência (n)") + 
  coord_flip() + 
  theme_minimal()

reordenando os níveis do fator idade:

ggplot(risco_analise, aes(x = fct_rev(q1_1))) + 
  geom_bar() +
  labs(x="Idade",                          
       y="Frequência (n)") + 
  coord_flip() + 
  theme_minimal()

Diferenciando as categorias com cores:

ggplot(risco_analise, aes(x = fct_rev(q1_1), fill = q1_1)) + 
  geom_bar() +
  labs(x= "Idade",                          
       y = "Frequência (n)") + 
  coord_flip() + 
  theme_minimal()

Anotando as barras: porcentagens

risco_anot <- risco_analise |>
  group_by(q1_1) |>
  summarize(n = n()) |>
  mutate(
         pct = n / sum(n),
         lbls = scales::percent(pct)
        )


ggplot(risco_anot, aes(x = q1_1, y = pct, fill = q1_1)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(aes(label = lbls),
            vjust = -0.5,
            size = 3) + 
  labs(x = "Idade",
       y = "Frequência (n)") +
  theme_minimal()

Anotando as barras: totais

risco_anot2 <- risco_analise |>
  group_by(q1_1) |>
  summarize(n = n()) |>
  mutate(
         total = n,
         lbls = scales::number(total)
        )


ggplot(risco_anot2, aes(x = q1_1, y = total, fill = q1_1)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(aes(label = lbls),
            vjust = -0.5,
            size = 3) + 
  labs(x = "Idade",
       y = "Frequência (n)") +
  theme_minimal()

Covariação entre Variáveis Numéricas

Gráficos de Dispersão:

Covariação: Dispersão e \(r_{xy}\)

Covariação: Gráfico de Dispersão

ggplot(data = carteira) +
  geom_point(mapping = aes(x = VALE, y = PETR4.SA))

Covariação: Gráfico de Dispersão

ggplot(data = carteira) +
  geom_bin2d(mapping = aes(x = VALE, y = PETR4.SA))

Covariação: Gráfico de Dispersão

ggplot(data = carteira) +
  geom_point(mapping = aes(x = VALE, y = PETR4.SA)) +
  geom_smooth(mapping = aes(x = VALE, y = PETR4.SA), method = "lm", se = FALSE)

Covariação: Gráfico de Dispersão

ggplot(data = carteira) +
  geom_point(mapping = aes(x = WEGE3.SA, y = PETR4.SA))

Covariação: Gráfico de Dispersão

ggplot(data = carteira) +
  geom_bin2d(mapping = aes(x = WEGE3.SA, y = PETR4.SA))

Covariação: Gráfico de Dispersão

ggplot(data = carteira) +
  geom_point(mapping = aes(x = WEGE3.SA, y = PETR4.SA)) +
  geom_smooth(mapping = aes(x = WEGE3.SA, y = PETR4.SA), method = "lm", se = FALSE)

Covariação: Gráfico de Dispersão

ggplot(data = carteira) +
  geom_point(mapping = aes(x = WEGE3.SA, y = VALE))

Covariação: Gráfico de Dispersão

ggplot(data = carteira) +
  geom_bin2d(mapping = aes(x = WEGE3.SA, y = VALE))

Covariação: Gráfico de Dispersão

ggplot(data = carteira) +
  geom_point(mapping = aes(x = WEGE3.SA, y = VALE)) +
  geom_smooth(mapping = aes(x = WEGE3.SA, y = VALE), method = "lm", se = FALSE)

Tudo ao Mesmo Tempo

library(PerformanceAnalytics)
chart.Correlation(carteira, histogram = TRUE)

Gráficos de Linha para Séries Temporais

Características observáveis em gráficos de séries temporais:

Sistema Gerenciador de Séries do Banco Central do Brasil

library(GetBCBData)
library(ggplot2)

# define ids
id.series <- c(utilizacao_capacidade_instalada = 1344)
first.date = '2010-01-01'

# obtem serie do bcb
df_uci <- gbcbd_get_series(id = id.series,
                            first.date = first.date,
                            last.date = Sys.Date(), 
                            use.memoise = FALSE)

# grafico de linha via ggplot2
ggplot(data = df_uci, aes(x = ref.date, y = value)) + 
  geom_line(color = "blue") + 
  labs(x = 'Trimestre', y = 'Utilização da Capacidade Instalada (%)', 
       title  = 'Utilização da capacidade instalada - Geral (FGV)',
       subtitle = "Periodicidade: Trimestral",
       caption = "Fonte: Elaborado pelo Autor com dados da FGV") 

Gráfico de Linha para Séries Temporais